package edu.cgpi.view;

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JPanel;

import edu.cgpi.core.entidade.Ponto;
import edu.cgpi.core.entidade.grafico.Imagem;
import edu.cgpi.core.entidade.grafico.Retangulo2D;
import edu.cgpi.core.util.Desenhista;

public class PainelDesenho extends JPanel {

	private static final long serialVersionUID = -8451011270865122574L;

	private Desenhista desenhista;
	private Imagem imagemEmConstrucao;
	private Retangulo2D areaClipping;
	private List<Imagem> imagens;

	public PainelDesenho(Desenhista desenhista) {
		GerenciadorUI.getInstance().setPainelDesenho(this);
		this.desenhista = desenhista;
		areaClipping = new Retangulo2D(new Ponto(0.0, 0.0), new Ponto((double) getWidth(), (double) getHeight()));
		imagens = new ArrayList<Imagem>();
		setBorder(BorderFactory.createLineBorder(Color.BLACK));
	}

	public Imagem getImagemEmConstrucao() {
		return imagemEmConstrucao;
	}

	public void setImagemEmConstrucao(Imagem imagem) {
		this.imagemEmConstrucao = imagem;
	}
	
	public Retangulo2D getAreaClipping() {
		return areaClipping;
	}
	
	public void setAreaClipping(Retangulo2D areaClipping) {
		this.areaClipping = areaClipping;
	}
	
	public List<Imagem> getImagens() {
		return imagens;
	}

	public void adicionar(Imagem imagem) {
		imagens.add(imagem);
		repaint();
	}

	public void removerUltimaImagem() {
		imagens.remove(imagens.size() - 1);
		repaint();
	}

	public void clearImagemEmConstrucao() {
		imagemEmConstrucao = null;
	}
	
	public void clearAreaClipping() {
		areaClipping = null;
	}

	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		if (haImagemSendoDesenhada()) {
			desenhista.desenhar(imagemEmConstrucao, g);
		}
		if (haAreaClipping()) {
			desenhista.desenhar(areaClipping, g);
		}
		for (Imagem imagem : imagens) {
			desenhista.desenhar(imagem, g);
		}
	}

	private boolean haImagemSendoDesenhada() {
		if (imagemEmConstrucao != null)
			return true;
		else
			return false;
	}
	
	private boolean haAreaClipping() {
		if (areaClipping != null)
			return true;
		else
			return false;
	}

	public void setImagens(List<Imagem> imagens) {
		this.imagens = imagens;
		this.repaint();
	}
}